/*
 * comunicador-cliente.h
 *
 *  Created on: 18/10/2011
 *      Author: guido
 */

#ifndef COMUNICADOR_CLIENTE_H_
#define COMUNICADOR_CLIENTE_H_

class ComunicadorCliente: public Thread {
public:
	ComunicadorCliente(SistemaUsuarios* usuarios, Socket* cliente) {
		this->usuarios = usuarios;
		this->cliente = cliente;
	}
	~ComunicadorCliente() {
	}
	void run() {
		char codigo;
		MensajeLogin* mensaje = NULL;
		recibirLogin(codigo, mensaje);
		if (codigo == OK) {
			cambiarClave(mensaje);
		}
		delete socket;
	}
	MensajeLogin* recibirLogin(char &codigo, MensajeLogin* &mensaje) {
		mensaje = cliente->recibirMensajeLogin();
		std::string nombre = mensaje->getNombre();
		std::string clave = mensaje->getClave();
		char codigo;
		if (usuarios->usuarioExiste(nombre, clave)) {
			codigo = OK;
		} else {
			codigo = ERROR_USUARIO_INEXISTENTE;
		}
		socket->enviar(&codigo, 1);
		return mensaje;
	}

	char cambiarClave(MensajeLogin* mensaje) {
		cliente->recibir(&codigo, 1);
		if (codigo == 2) {
			MensajeClave* mensajeCambio = cliente->recibirMensajeCambioClave();
			std::string nombre = mensaje->getNombre();
			std::string clave = mensaje->getClave();
			std::string nueva = mensajeCambio->getClave();
			usuarios->cambiarClave(mensaje, clave, nueva);
			codigo = 0;
			cliente->enviar(&codigo, 1);
		}
	}
private:
	Servidor* usuarios;
	Socket* cliente;
};

#endif /* COMUNICADOR_CLIENTE_H_ */
